%macro C 0
	enter 0,0
	push esi
	push edi
	push ebx
%endmacro
%macro endC 0
	push ebx
	push edi
	push esi
	leave
	ret
%endmacro

section .data


section .text
extern malloc
extern free
global iesimo
global buscar
global agregarAd
global agregarAt
global eliminar
global eliminarApariciones
global eliminarRepetidos

iesimo:
	C
	mov ecx,[ebp+12]	;ecx=iesimo
	mov esi,[ebp+8]	;esi=nodo*primero
	.loop:
		dec ecx
		jecxz .fin		;ecx==0?
		mov esi,[esi+4];esi=nodo*prox
		jmp .loop
	.fin:
	mov eax,[esi]
	endC

buscar:
	C
	mov ebx,[ebp+12]	;ebx=valor que estoy buscando
	xor eax,eax			;eax=1 (posicion actual)
	inc eax
	mov esi,[ebp+8]	;esi=nodo* primero
	.loop:
		cmp [esi],ebx	;dato==ebx?
		je .fin
		inc eax			;eax++
		mov esi,[esi+4];esi=nodo* prox
		cmp esi,0		;esi==NULL?
		jne .loop
	xor eax,eax			;eax=0 (no encontre el valor, devuelve 0)
	.fin:					;return eax
	endC

agregarAd:
	C
	push 8
	call malloc
	mov esi,[ebp+8]	;esi=lista*
	mov ebx,[esi]		;ebx=primero*
	mov ecx,[ebp+12]	;ecx=dato
	mov [eax],ecx		;guardo el dato
	mov [eax+4],ebx	;nodo* prox=lista.primero
	mov [esi],eax		;lista.primero = new nodo
	endC

agregarAt:
	C
	push 8
	call malloc
	mov edx,[ebp+12]			;edx=dato
	mov [eax],edx				;guardo el dato
	mov dword [eax+4],0		;nodo* prox=NULL
	mov esi,[ebp+8]			;esi=lista*
	mov ecx,[esi]				;ecx=primero*
	jecxz .listaVacia
	.loop:
		cmp dword [ecx+4],0	;nodo*prox==NULL?
		je .ok
		mov ecx,[ecx+4]		;ecx=nodo*prox
		jmp .loop
	.ok:
	mov [ecx+4],eax			;ultimoNodo.prox = new nodo
	jmp .fin
	.listaVacia:
	mov [esi],eax				;lista.primero = new nodo
	.fin:
	endC

eliminar:
	C
	mov esi,[ebp+8]	;esi=lista*
	mov ebx,esi			;ebx=proximo**
	mov edi,[ebp+12]	;edi=aBorrar
	mov ecx,[esi]		;ecx=nodo*primero
	.loop:
		jecxz .fin		;nodo*==NULL?
		cmp [ecx],edi	;dato==aBorrar?
		je .borrar
		mov ebx,ecx		;
		add ebx,4
		mov ecx,[ecx+4];ecx=nodo*prox
		jmp .loop
	.borrar:
		mov eax,[ecx+4]
		mov [ebx],eax
		push ecx
		call free
		pop ecx
	.fin:
	endC

eliminarApariciones:
	C
	mov esi,[ebp+8]	;esi=lista*
	mov ebx,esi			;ebx=proximo**
	mov edi,[ebp+12]	;edi=aBorrar
	mov ecx,[esi]		;ecx=nodo*primero
	.loop:
		jecxz .fin		;nodo*==NULL?
		cmp [ecx],edi	;dato==aBorrar?
		jne .cont
		mov eax,[ecx+4]
		mov [ebx],eax
		push ecx
		call free
		pop ecx
		.cont:
		mov ebx,ecx		;ebx=prox**
		add ebx,4
		mov ecx,[ecx+4];ecx=nodo*prox
		jmp .loop
	.fin:
	endC

eliminarRepetidos:
	C
	mov esi,[ebp+8]	;esi=lista*
	mov ebx,esi			;ebx=proximo**
	mov ecx,[esi]		;ecx=nodo*primero
	.loop:
		jecxz .fin		;nodo*==NULL?
		push ecx
		call buscar
		pop ecx
		cmp eax,0		;buscar(dato,resto de la lista)>0?
		je .cont
		mov eax,[ecx+4];borrarlo
		mov [ebx],eax
		push ecx
		call free
		pop ecx
		.cont:
		mov ebx,ecx		;ebx=prox**
		add ebx,4
		mov ecx,[ecx+4];ecx=nodo*prox
		jmp .loop
	.fin:
	endC
